<?php

declare(strict_types=1);

namespace App\Core;

use PDO;
use UUID\UUID;

/**
 * Obtiene una conexión de la base base de datos.
 */
class Database
{
    private const CONFIG_FILENAME = 'database';

    private static PDO $connection;

    /**
     * Obtiene las opciones de configuración.
     */
    private static function getOptions(): array
    {
        return Config::readFile(self::CONFIG_FILENAME);
    }

    /**
     * Genera el DSN de origen de la conexión de la base de datos.
     */
    private static function generateDsn(array $options): string
    {
        $dsn = sprintf('%s:host=%s;port=%u;dbname=%s',
            $options['driver'],
            $options['host'],
            $options['port'],
            $options['database']);

        if ($options['driver'] === 'mysql') {
            $dsn = sprintf('%s;charset=%s', $dsn, $options['charset']);
        }

        return $dsn;
    }

    /**
     * Establece una conexión con la base de datos.
     */
    private static function setConnection(array $options): void
    {
        self::$connection = new PDO(self::generateDsn($options), $options['username'], $options['password'], $options['options']);
    }

    /**
     * Obtiene una sola conexión de la base de datos.
     */
    public static function getConnection(): PDO
    {
        if (empty(self::$connection)) {
            self::setConnection(self::getOptions());
        }

        return self::$connection;
    }

    /**
     * Genera un UUID aleatorio.
     */
    public static function generateUuid(): string
    {
        return UUID::uuid4();
    }
}
